package com.hiraeth.modules.monitor.model;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.hiraeth.modules.monitor.model.common.BasicAuth;
import com.hiraeth.modules.monitor.model.common.TlsConfig;
import com.hiraeth.modules.monitor.model.global.GlobalConfig;
import com.hiraeth.modules.monitor.model.sd.*;
import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ScrapeConfig implements Serializable {
	
	private static final long serialVersionUID = 5531750204585858848L;

	/*
	<duration>：匹配正则表达式 [0-9]+(ms|[smhdwy])的持续时长
	<labelname>：匹配正则表达式[a-z_a-Z_][a-z_a-Z0-9_]*的字符串
	<labelvalue>：unicode字符串
	<filepath>：在当前工作目录的有效路径
	<boolean>：一个可以取true或false值的布尔值
	<string>：常规字符串
	<secret>：保密的常规字符串，如密码
	<tmpl_string>：在使用之前经过模板扩展的字符串
	<tmpl_secret>：在使用之前模板扩展的字符串，这是一个secret
	*/
	
	/**
	 * 默认分配给已抓取指标的job名称。job_name在所有scrape配置中必须是唯一的。
	 */
	private String job_name;
	
	/**
	 * 从job中抓取目标的频率。[duration]匹配正则表达式 [0-9]+(ms|[smhdwy])的持续时长
	 * 默认值{@link GlobalConfig#scrape_interval}
	 */
	private String scrape_interval = "15s";
	
	/**
	 * 抓取此job时，每次抓取超时时间。[duration]匹配正则表达式 [0-9]+(ms|[smhdwy])的持续时长
	 */
	private String scrape_timeout = "10s";
	
	/**
	 * 从目标获取指标的HTTP资源路径。默认为“/metrics”
	 */
	private String metrics_path;
	
	/**
	 * honor_labels控制Prometheus如何处理已经存在于已抓取数据中的标签与Prometheus将附加服务器端的标签之间的冲突（"job"和"instance"标签，手动配置的目标标签以及服务发现实现生成的标签）。
	 * 如果honor_labels设置为"true"，则通过保留已抓取数据的标签值并忽略冲突的服务器端标签来解决标签冲突。
	 *  如果honor_labels设置为"false"，则通过将已抓取数据中的冲突标签重命名为"exported_ <original-label>"（例如"exported_instance"，"exported_job"）然后附加服务器端标签来解决标签冲突。 这对于联合等用例很有用，其中应保留目标中指定的所有标签。
	 *  请注意，任何全局配置的"external_labels"都不受此设置的影响。 在与外部系统通信时，它们始终仅在时间序列尚未具有给定标签时应用，否则将被忽略。
	 */
	private Boolean honor_labels;
	
	/**
	 * 如果honor_timestamps设置为true，则会使用抓取数据中的时间戳；如果设置为false，则将抓取数据中的时间戳忽略
	 */
	private Boolean honor_timestamps = true;
	
	/**
	 * 配置用于请求的协议。默认http
	 */
	private String scheme = "http";
	
	/**
	 * 可选的HTTP URL参数
	 */
	private Map<String, String> params;
	
	/**
	 * 使用配置的用户名和密码在每个scrape请求上设置`Authorization`标头。 password和password_file是互斥的。
	 */
	private BasicAuth basic_auth;
	
	/**
	 * 使用配置的承载令牌在每个scrape请求上设置`Authorization`标头。 它`bearer_token_file`和是互斥的。
	 */
	private String bearer_token;

	/**
	 * 使用配置的承载令牌在每个scrape请求上设置`Authorization`标头。 它`bearer_token`和是互斥的。
	 */
	private String bearer_token_file;
	
	/**
	 * 配置scrape请求的TLS设置
	 */
	private TlsConfig tls_config;
	
	/**
	 * 可选的代理URL
	 */
	private String proxy_url;
	
	/**
	 * Azure服务发现配置列表
	 */
	private List<AzureSdConfig> azure_sd_configs;
	
	/**
	 * consul服务发现配置列表。
	 */
	private List<ConsulSdConfig> consul_sd_configs;
	
	/**
	 * DNS服务发现配置列表。
	 */
	private List<DnsSdConfig> dns_sd_configs;
	
	/**
	 * EC2服务发现配置列表。
	 */
	private List<Ec2SdConfig> ec2_sd_configs;
	
	/**
	 * Open_stack服务发现配置列表
	 */
	private List<OpenstackSdConfig> openstack_sd_configs;
	
	/**
	 * 文件服务发现配置列表
	 */
	private List<FileSdConfig> file_sd_configs;
	
	/**
	 * GCE服务发现配置列表
	 */
	private List<GceSdConfig> gce_sd_configs;
	
	/**
	 * kubernetes 服务发现配置列表
	 */
	private List<KubernetesSdConfig> kubernetes_sd_configs;
	
	/**
	 * Marathon服务发现配置列表。
	 */
	private List<MarathonSdConfig> marathon_sd_configs;
	
	/**
	 * Air_bn_b的神经服务发现配置列表
	 */
	private List<NerveSdConfig> nerve_sd_configs;
	
	/**
	 * Zookeeper Serverset服务发现配置列表
	 */
	private List<ServersetSdConfig> serverset_sd_configs;
	
	/**
	 * Triton服务发现配置列表。
	 */
	private List<TritonSdConfig> triton_sd_configs;
	
	/**
	 * 此作业的标记为静态配置的目标列表。
	 */
	private List<StaticConfig> static_configs;
	
	/**
	 * 目标重新标记配置列表。
	 */
	private List<RelabelConfig> relabel_configs;
	
	/**
	 * 度量标准重新配置列表。
	 */
	private List<RelabelConfig> metric_relabel_configs;
	
	/**
	 * 对每个将被接受的样本数量的每次抓取限制。
	 * 如果在度量重新标记后存在超过此数量的样本，则整个抓取将被视为失败。 0表示没有限制。
	 */
	private Integer sample_limit;
}
